﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using SIGEB.Prototipo.Vista.UI;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo.moduloComputadoras;
using SIGEB.Modelo.moduloPerfiles;

namespace SIGEB.Prototipo.Vista.moduloComputadoras
{
    public partial class frm_Computadoras : frm_ModuloBase
    {
        #region CONSTRUCTORES
    
        public frm_Computadoras()
        {
            InitializeComponent();
        }

        public frm_Computadoras(Control.controlPrincipal cp):base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);

            listaComputadoras = new LinkedList<string[]>();

            //ckb_seleccionarTodo = new CheckBox();
            //ckb_seleccionarTodo.Size = new Size(13, 13);
            //ckb_seleccionarTodo.Location = new Point(((dgv_listaComputadoras.Columns[1].HeaderCell.Size.Width - 13) / 2) + 1, ((dgv_listaComputadoras.Columns[0].HeaderCell.Size.Height - 13) / 2) + 1);
            //ckb_seleccionarTodo.CheckedChanged += new EventHandler(ckb_seleccionarTodo_CheckedChanged);
            //dgv_listaComputadoras.Controls.Add(ckb_seleccionarTodo);
            //mni_gestion = new MenuItem("Gestión de Contraseñas", new EventHandler(mni_gestion_Click), Shortcut.CtrlP);
            //mni_Archivo.MenuItems.Add(mni_gestion);
            //mmn_Principal.MenuItems.Add(0, mni_Archivo);

            Menu = mmn_Principal;
        }
        
        #endregion

        #region MÉTODOS

        public override void hacerVisible(object[] arg)
        {
            base.hacerVisible(arg);
            if (!cp.usuarioActualPuede(acciones.PC_APAGAR))
            {
                lbl_descripcion.Enabled = false;
                comboBox1.Enabled = false;
            }
            else
            {
                lbl_descripcion.Enabled = true;
                comboBox1.Enabled = true;
            }
            Detectar();
        }

        protected override void CerrarVentana(object sender, FormClosingEventArgs e)
        {
            if (btn_detectar.Text.Equals("Cancelar"))
            {
                DetectaDetener();
            }
            dgv_listaComputadoras.Rows.Clear();
            currentIp = null;
            base.CerrarVentana(sender, e);
        }

        private void frm_Computadoras_Load(object sender, EventArgs e)
        {
            this.Size = new Size(this.Size.Width + 1, this.Size.Height);
        }

        private void Detectar()
        {
            Thread th_reconocimiento = new Thread(new ThreadStart(DetectarReconocer));
            th_reconocimiento.Start();
        }

        private void DetectaDetener()
        {
            detenido = true;
            comboBox1.SelectedIndex = -1;
            detecta.DetenerDetectaRedes();
            detecta.liberar();
            btn_detectar.Text = "Detectar";
        }

        private void DetectarReconocer()
        {
            detenido = false;
            detecta = null;
            detecta = new DetectaRedes.Pinging();

            this.Invoke((MethodInvoker)delegate { btn_detectar.Text = "Cancelar"; });
            this.Invoke((MethodInvoker)delegate { dgv_listaComputadoras.Rows.Clear(); });

            Thread th_mensajes = new Thread(new ThreadStart(DetectaProgreso));
            th_mensajes.Start();

            this.listaComputadoras.Clear();
            this.listaComputadoras = detecta.DetectaRedes();
            DetectaResultado();
        }

        private void DetectaResultado()
        {
            foreach (string[] c in listaComputadoras)
            {
                this.Invoke((MethodInvoker)delegate { agregar(c[0], c[1]); });
            }
            this.Invoke((MethodInvoker)delegate { lbl_numMaquinasDetectadas.Text = listaComputadoras.Count > 1 ? listaComputadoras.Count.ToString() + " Máquinas Detectadas." : listaComputadoras.Count.ToString() + " Máquina Detectada."; });
            this.Invoke((MethodInvoker)delegate { btn_detectar.Text = "Detectar"; });
            listaComputadoras.Clear();
        }

        private void DetectaProgreso()
        {
            while (detecta.Progreso() != 100 && !detenido)
            {
                this.Invoke((MethodInvoker)delegate { lbl_mensajes.Text = detecta.Progreso().ToString() + "%"; });
            }
            this.Invoke((MethodInvoker)delegate { lbl_mensajes.Text = "Listo."; });
        }

        private void btn_detectar_Click(object sender, EventArgs e)
        {
            if (btn_detectar.Text.Equals("Detectar"))
            {
                Detectar();
                btn_detectar.Text = "Cancelar";
            }
            else
            {
                DetectaDetener();
            }
        }

        private void agregar(string ip, string nombreEquipo)
        {
            dgv_listaComputadoras.Rows.Add(false, ip, nombreEquipo);
        }

        #endregion

        #region EVENTOS

        private void mni_gestion_Click(object sender, EventArgs e)
        {
            //cp.abrirVentana(this, Control.controlPrincipal.VENTANA_COMPUTADORAS_GESTIONUC, null);
        }

        private void dgv_listaComputadoras_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((!e.RowIndex.Equals(-1)) && e.ColumnIndex.Equals(0))
            {
                deseleccionarTodo(e.RowIndex);
                DataGridViewCell cell = dgv_listaComputadoras.CurrentCell;
                if (dgv_listaComputadoras.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue != null && dgv_listaComputadoras.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue.Equals(true))
                {
                    currentIp = dgv_listaComputadoras.Rows[cell.RowIndex].Cells[1].Value.ToString();
                }
                else
                {
                    currentIp = null;
                }
            }
        }
        
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (comboBox1.SelectedIndex)
            {
                case 0: accionApagar(); break;
            }
        }

        private void accionApagar()
        {
            try
            {
                string ipSelected = getIpSelected();
                if (!string.IsNullOrEmpty(ipSelected))
                {
                    LinkedList<infoComputadora> lista = cp.ctrlInfoComputadoras.obtenerInfoComputadoras();
                    bool sirve=false;
                    foreach (infoComputadora n in lista)
                    {
                        if (cp.ctrlInfoComputadoras.permisosComputadoraValidos(n.username, n.password, ipSelected))
                        {
                            cp.ctrlInfoComputadoras.apagarComputadora(n.username, n.password, ipSelected);
                            sirve = true;
                        }
                    }
                    if(!sirve)
                    {
                        infoComputadora obj = new infoComputadora(null, string.Empty, string.Empty);
                        for (int i = 0; i < 3; i++)
                        {
                            new PeticionUsrPwd(obj).ShowDialog();
                            if (!string.IsNullOrEmpty(obj.username) && !string.IsNullOrEmpty(obj.password))
                            {
                                lbl_mensajes.Text = "Verificando credenciales...";
                                if (cp.ctrlInfoComputadoras.permisosComputadoraValidos(obj.username, obj.password, ipSelected))
                                {
                                    cp.ctrlInfoComputadoras.apagarComputadora(obj.username, obj.password, ipSelected);
                                    lbl_mensajes.Text = "Listo.";
                                    try
                                    {
                                        cp.ctrlInfoComputadoras.crearInfoComputadora(obj.username, obj.password);
                                    }
                                    catch { }
                                    deseleccionarTodo(-1);
                                    return;
                                }
                                lbl_mensajes.Text = "Credenciales incorrectos.";
                            }
                        }
                        mostrarInfo("Ha excedido el límite de ingreso de credenciales.");
                        lbl_mensajes.Text = "Listo.";
                        deseleccionarTodo(-1);
                    }
                }
                else
                {
                    mostrarInfo("Seleccione una computadora de la lista mostrada.");
                    comboBox1.SelectedIndex = -1;
                }
            }
            catch (Exception ex)
            {
                ventanaError(ex.Message);
            }
        }

        private string getIpSelected()
        {
            return currentIp; //"192.168.2.5";
        }

        private void deseleccionarTodo(int index)
        {
            for (int i = 0; i < dgv_listaComputadoras.Rows.Count; i++)
            {
                if (!i.Equals(index))
                {
                    dgv_listaComputadoras[0, i].Value = false;
                }
            }
        }

        //private void ckb_seleccionarTodo_CheckedChanged(object sender, EventArgs e)
        //{
        //    for (int i = 0; i < dgv_listaComputadoras.RowCount; i++)
        //    {
        //        if (dgv_listaComputadoras[0, i].Value.Equals(true))
        //            dgv_listaComputadoras[0, i].Value = false;
        //        else
        //            dgv_listaComputadoras[0, i].Value = true;
        //    }
        //}

        //private void dgv_listaComputadoras_SizeChanged(object sender, EventArgs e)
        //{
        //    //ckb_seleccionarTodo.Location = new Point(((dgv_listaComputadoras.Columns[0].HeaderCell.Size.Width - 13) / 2) + 1, ((dgv_listaComputadoras.Columns[0].HeaderCell.Size.Height - 13) / 2) + 1);
        //}

        #endregion

        #region ATRIBUTOS

        private bool detenido = false;
        private LinkedList<string[]> listaComputadoras;
        private DetectaRedes.Pinging detecta;
        private string currentIp = null;
        //private CheckBox ckb_seleccionarTodo;
        //private MenuItem mni_gestion;

        #endregion
    }
}
